Two things with this hack...
  First, change the address for the count to first position, then the address for the pointers one word ahead (80079C28, 80079C2C).
  Second, change the parsing routine to catch the set numbers.
  This is rather easy.  First, use a simple MULT instead of the shifts to save space.  Secondly, grab the player total [8002B520].  Thirdly, grab the op's third word [LW X,0008 (S0)].  If 0, just do normally.  If set#=#players, also extract.  Otherwise, branch past.  
  To do without frying demos...
  

console: rewrite the routine!  set the JR in the table, then JR back to the normal branch.
  skip the set number extraction (fry demos) and assume the preset list exists.


Sets patch:
USA
03A5C0 50 3C018008140200048E0F0008100F00033C0280038C42B520144F000F3C0A80078E0800048C229C6800084880012848238D4A5D1800094880012848230009488000026080002C6021012A5821AD8B9C28



--------------------

7F005820:
LW	S0,5D08 (S0)
SW	R0,0000 (S1)
LUI	AT,8003
LUI	S2,8003
SW	R0,642C (AT)	//0->8003642C
MTC1	R0,F4
ADDIU	S2,S2,6430	//S2=80036430
SW	R0,0000 (S2)	//0->80036430
LUI	AT,8003
SW	R0,007C (SP)
SW	R0,6434 (AT)	//0->80036434
JAL	7000695C	//returns V0=stage#
SWC1	F4,0088 (SP)
//7F005854:	CUBA-specific routines
ADDIU	AT,R0,0036
BNE	V0,AT,7F005888	//branch if stage# !=36 (cuba)
LUI	A0,0004
ORI	A0,A0,6EA0	//A0=46EA0
JAL	70009720
ADDIU	A0,R0,0004
//7F00586C:
ADDIU	T2,V0,003F
ADDIU	AT,R0,FFC0	//AT=FFC0
SW	V0,0000 (S1)
AND	T3,T2,AT
ADDIU	T4,R0,0001	//T4=1
SW	T3,0000 (S1)
SW	T4,0000 (S2)
//7F005888:	reset runtime variables
LUI	AT,8003
SW	R0,6438 (AT)	//0->80036438
LUI	AT,8003
SW	R0,643C (AT)	//0->state of credits
LUI	AT,8003
LUI	V0,8008
SW	R0,6440 (AT)	//0->P.to credits text
MTC1	R0,F6
MTC1	R0,F8
MTC1	R0,F10
ADDIU	V0,V0,9990	//V0=80079990
LUI	AT,8003
SWC1	F6,0000 (V0)
SWC1	F8,0004 (V0)
SWC1	F10,0008 (V0)
SW	R0,6444 (AT)	//0->plastique explosion reg
LUI	AT,8008
SW	R0,9C68 (AT)	//0->80079C68
LUI	AT,8003
SW	R0,6448 (AT)	//0->PLAYER TANK control reg
LUI	AT,8003
SW	R0,644C (AT)	//0->8003644C
MTC1	R0,F16
LUI	AT,8003
SW	R0,6450 (AT)	//0->80036450
LUI	AT,8003
LUI	V1,8003
SWC1	F16,6454 (AT)
MTC1	R0,F18
ADDIU	V1,V1,6458	//V1=80036458
MTC1	R0,F4
SW	R0,0000 (V1)	//0->80036458
SW	R0,0004 (V1)	//0->8003645C
LUI	AT,8003
SWC1	F18,6460 (AT)
MTC1	R0,F6
//7F005918:
...
//7F005A38:	retrieve spawn locations
LW	V0,0000 (S0)	//next command in spawn block
ADDIU	AT,R0,0009	//AT=9
LUI	S2,8008
BEQ	V0,AT,7F005DF4	//if endpoint reached branch
LUI	AT,42C8
MTC1	AT,F22
LUI	AT,4780
MTC1	AT,F20
ADDIU	S2,S2,A0B0	//S2=8007A0B0
SLTIU	AT,V0,0009	//TRUE if command < endcommand
BEQ	AT,R0,7F005DE0	//END at endcommand
SLL	T8,V0,0x2	//T8=COMMAND->offset
LUI	AT,8005
ADDU	AT,AT,T8
LW	T8,F1AC (AT)	//T8=op application routine
JR	T8
NOP

7F005A7C [0x3A5AC]	0 (spawn) op application
3C0E8007	LUI	T6,8007
8DCE5D18	LW	T6,5D18 (T6)	//T6=offset to 0xxx preset table
11C00018	BEQ	T6,R0,7F005AE8	//abort if no 0xxx presets!
00000000	NOP
0FC30288	JAL	7F0C0A20	//returns set number when demos are running
00000000	NOP
8E0F0008	LW	T7,0008 (S0)	//T7=set#
3C0A8007	LUI	T2,8007
3C018008	LUI	AT,8008
144F0011	BNE	V0,T7,7F005AE8	//branch if wrong set
00000000	NOP
//7F005AA8:
8E080004	LW	T0,0004 (S0)	//preset
3C028008	LUI	V0,8008
8C429C68	LW	V0,9C68 (V0)	//V0=80079C68 (SPAWN COUNTER)
00084880	SLL	T1,T0,0x2
01284823	SUBU	T1,T1,T0
8D4A5D18	LW	T2,5D18 (T2)	//T2=0xxx preset list
00094880	SLL	T1,T1,0x2
01284823	SUBU	T1,T1,T0
00094880	SLL	T1,T1,0x2	//T1=offset to preset (preset * 0x2C)
00026080	SLL	T4,V0,0x2	//T4=offset in spawn pointer list
002C0821	ADDU	AT,AT,T4
012A5821	ADDU	T3,T1,T2	//T3=address of preset
//7F0C5AD8:
AC2B9C28	SW	T3,9C28 (AT)	//save address of preset
3C018008	LUI	AT,8008
244D0001	ADDIU	T5,V0,0001	//count++
AC2D9C68	SW	T5,9C68 (AT)	//save new count
100000BE	BEQ	R0,R0,7F005DE4
2610000C	ADDIU	S0,S0,000C	//S0=next command

8E080004
3C028008
8C429C68	0x3A5E0
00084880
01284823
8D4A5D18

++++++++++++++++++++
rewrite:
LUI	T6,8007
LW	T6,5D18 (T6)	//T6=offset to 0xxx preset table
BEQ	T6,R0,7F005AE8	//abort if no 0xxx presets!
NOP
JAL	7F0C0A20	//returns set number when demos are running.  V0 only !0 when demo running!
			//T2, T7, and AT not affected, so exploiting!
*LUI	at,8008
*bne	V0,R0,test
LW	T7,0008 (S0)	//T7=set#
//set0 in multi always on
*beq	t7,r0,expando!
*lui	v0,8003
*lw	v0,b520 (v0)	//v0=#players (essentially, same as parsing sets)
//test
*bne	v0,t7,end
//expando!
LUI	T2,8007
LW	T0,0004 (S0)	//preset
*LW	V0,9C68 (at)	//V0=80079C68 (SPAWN COUNTER)
SLL	T1,T0,0x2
SUBU	T1,T1,T0
LW	T2,5D18 (T2)	//T2=0xxx preset list
SLL	T1,T1,0x2
SUBU	T1,T1,T0
SLL	T1,T1,0x2	//T1=offset to preset (preset * 0x2C)
SLL	T4,V0,0x2	//T4=offset in spawn pointer list
*ADDU	T4,AT,T4
ADDU	T3,T1,T2	//T3=address of preset
*SW	T3,9C28 (T4)	//save address of preset
ADDIU	T5,V0,0001	//count++
SW	T5,9C68 (AT)	//save new count
//7F0C5AE8:	end
BEQ	R0,R0,7F005DE4
ADDIU	S0,S0,000C	//S0=next command
++++++++++++++++++++

7F005DE4	LOOP UNTIL ALL INTRO COMMANDS ARE COMPLETED
LW	V0,0000 (S0)	//V0=next command
ADDIU	AT,R0,0009	//AT=9 (endcommand)
BNEL	V0,AT,7F005A60
SLTIU	AT,V0,0009	//TRUE if command < endcommand


-----------------------------
7F0C0A20:	subroutine	extracts set number (probably)
ADDIU	SP,SP,FFE8
SW	RA,0014 (SP)
JAL	7F0BFC8C	//returns V0=?
NOP
BNEZ	V0,7F0C0A44
NOP
JAL	7F0BFC98	//returns V0=?
NOP
BEQ	V0,R0,7F0C0A54
//7F0C0A44:
LUI	T6,8005
LW	T6,8468 (T6)	//T6=80048468
BEQ	R0,R0,7F0C0A58
LW	V0,0088 (T6)
//7F0C0A54:
OR	V0,R0,R0	//V0=0
LW	RA,0014 (SP)
ADDIU	SP,SP,0018
JR	RA
NOP

-------------------------
7000695C:	RETURNS V0=stage #
LUI	V0,8002
JR	RA
LW	V0,41A8 (V0)	//V0=800241A8

7F0BFC8C:	RETURNS V0=?
LUI	V0,8005
JR	RA
LW	V0,8474 (V0)	//V0=80048474

7F0BFC98:	RETURNS V0=?
LUI	V0,8005
JR	RA
LW	V0,8480 (V0)	//V0=80048480

----------------------------
-----------------------------
------------------------------
-------------------------------
Spawn selection routine
7F005E98:
LW	T0,9C68 (T0)	//T0=count (80079C68)
BLEZL	T0,7F005F50
	ADDIU	A0,SP,008C
JAL	7F09A464
NOP
SLTI	AT,V0,0002
BNEZ	AT,7F005ED4
LUI	T1,8008
LW	T1,9C68 (T1)	//T1=count
BLEZL	T1,7F005ED8
OR	V1,R0,R0
JAL	7F0790F0
NOP
BEQ	R0,R0,7F005ED8
OR	V1,V0,R0
//7F005ED4:
OR	V1,R0,R0
LUI	T2,8008
ADDIU	T2,T2,9C28	//T2=base for spawn list

SLL	T3,V1,0x2	//T3=V1->offset
ADDU	S1,T3,T2	//S1=SPAWN pointer
LW	S0,0000 (S1)	//S0=address of preset



7F09A464	crazy subroutine...
//7F07912C:
LUI	T6,8008
LW	T6,9C68 (T6)
//7F07915C:
ADDIU	S5,S5,9C28

AND MUCH MORE...






++++++++++++++++++++
USED WHEN TRYING TO RESPAWN (HOPEFULLY RANDOMIZATION ROUTINE!)
//7F088984:
JAL	7F08A380
SW	T7,1128 (T0)
JAL	7F08A928
ADDIU	A0,R0,FFFF
JAL	7F09A464
NOP
//7F08899C:
SLTI	AT,V0,0002
BNEZ	AT,7F0889C4
LUI	T1,8008
LW	T1,9C68 (T1)	//T1=spawn count
BLEZL	T1,7F0889C8	//do if invalid number (must be natural number)
	OR	V1,R0,R0
JAL	7F0790F0
NOP
BEQ	R0,R0,7F0889C8
OR	V1,V0,R0
//7F0889C4:	retrieve and opy preset data to Stack
OR	V1,R0,R0
SLL	T2,V1,0x2
LUI	V0,8008
ADDU	V0,V0,T2
LW	V0,9C28 (V0)
LWC1	F4,0000 (V0)
...



7F0790F0	I think this chooses a random spawn and does distance checking...
ADDIU	SP,SP,FFA0
SW	RA,0044 (SP)
SW	S8,0040 (SP)
SW	S7,003C (SP)
SW	S6,0038 (SP)
SW	S5,0034 (SP)
SW	S4,0030 (SP)
SW	S3,002C (SP)
SW	S2,0028 (SP)
SW	S1,0024 (SP)
SW	S0,0020 (SP)
JAL	7F09B150
SDC1	F20,0018 (SP)
JAL	7F09A464	//V0=#players
OR	S6,V0,R0
//7F07912C
LUI	T6,8008
LW	T6,9C68 (T6)	//T6=spawn count
OR	S2,V0,R0	//S2=#PLAYERS
ADDIU	S1,R0,0001	//S1=1
BLEZ	T6,7F07925C
OR	S7,R0,R0
LUI	AT,447A
LUI	S8,8008
LUI	S5,8008
LUI	S4,8008
MTC1	AT,F20		//F20=1000.
ADDIU	S4,S4,9EE0	//S4=player data offsets
ADDIU	S5,S5,9C28	//S5=spawn list
ADDIU	S8,S8,A0B0	//S8=current player offset
LW	V0,0000 (S8)	//V0=playerdata
LUI	T1,8008
ADDIU	S7,S7,0001	//S7++
LW	T7,29E0 (V0)	//don"t know.  ROOM? STATUS?  was set to 48...
OR	S1,R0,R0
OR	S0,R0,R0
ADDIU	T8,T7,0001	//T8=?+1
SW	T8,29E0 (V0)
LW	T9,0000 (S8)	//T9=playerdata
LW	T1,9C68 (T1)	//T1=spawncount
LW	T0,29E0 (T9)	//T0=?+1
DIV	T0,T1
MFHI	S3		//S3=T0%T1  0x49 is a prime number...
BNEZ	T1,7F0791A4
NOP
BREAK
//7F0791A4:
ADDIU	AT,R0,FFFF	//AT=-1
BNE	T1,AT,7F0791BC
LUI	AT,8000
BNE	T0,AT,7F0791BC
NOP
BREAK
//7F0791BC:
BLEZ	S2,7F07923C
NOP



----
7F09B150	SUBROUTINE	returns V0=8007A0B8
LUI	V0,8008
JR	RA
LW	V0,A0B8 (V0)

7F09A464	SUBROUTINE	returns V0=#players
